package com.tools.common.container;

import com.tools.common.container.r.OnlyReadArrayList;
import com.tools.common.container.r.OnlyReadHashSet;
import com.tools.common.container.r.OnlyReadLinkedSet;
import com.tools.common.container.r.OnlyReadTreeSet;
import com.tools.common.object.Note;

import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.Set;

/**
 * 自定义包装 Collection 容器接口
 * */
@Note("自定义包装 Collection 容器接口")
public interface OwnRows<T> extends Iterable<T> {

    /* *******************************************************************************************
     *
     *          增删方法
     *
     * *******************************************************************************************
     * */

    @Note("在集合末尾添加一个元素")
    OwnRows<T> add(T obj);

    @Note("在集合末尾依次添加 objs 数组内全部元素")
    OwnRows<T> addAll(T[] objs);

    @Note("在集合末尾依次添加 objs 可迭代容器内全部元素")
    OwnRows<T> addAll(Iterable<? extends T> objs);

    @Note("在集合中找到 obj 元素并移除")
    OwnRows<T> remove(Object obj);

    @Note("移除集合内与 objs 数组中所有元素相匹配的元素")
    OwnRows<T> removeAll(Object[] objs);

    @Note("移除集合内与 objs 可迭代容器中所有元素相匹配的元素")
    OwnRows<T> removeAll(Iterable<?> objs);

    /* *******************************************************************************************
     *
     *          查询方法
     *
     * *******************************************************************************************
     * */

    @Note("查询容器是否存在指定的元素")
    boolean contains(T obj);

    @Note("查询容器是否存在，数组内的所有元素")
    boolean containsAll(Object[] objs);

    @Note("查询容器是否存在，Collection 集合内的所有元素")
    boolean containsAll(Collection<?> objs);

    @Note("查询容器是否存在，自定义容器集合内的所有元素")
    boolean containsAll(OwnRows<?> objs);

    @Note("查询容器是否存在，可迭代容器内的所有元素")
    boolean containsAll(Iterable<?> objs);

    @Note("查询容器是否存在，数组内的任意一个元素")
    boolean containsAny(Object[] objs);

    @Note("查询容器是否存在，Collection 集合内的任意一个元素")
    boolean containsAny(Collection<?> objs);

    @Note("查询容器是否存在，自定义容器集合内的任意一个元素")
    boolean containsAny(OwnRows<?> objs);

    @Note("查询容器是否存在，可迭代容器内的任意一个元素")
    boolean containsAny(Iterable<?> objs);

    /* *******************************************************************************************
     *
     *          通用方法
     *
     * *******************************************************************************************
     * */

    @Note("获取指定索引位置的元素")
    T get(int index);

    @Note("获取指定索引位置的元素。若索引有误则返回默认值")
    T getOrDefault(int index, T defaultValue);

    @Note("返回集合的元素个数")
    int size();

    @Note("清空集合")
    void clear();

    @Note("判断容器是否为空")
    boolean isEmpty();

    @Note("随机从容器中返回一个数据")
    T random();

    @Note("获取容器内部的排序比较器")
    Comparator<? super T> getComparator();

    @Note("将自定义的集合容器，转换为 Collection 集合")
    Collection<T> toCollection();

    @Note("将自定义的集合容器，转换为 List 集合")
    List<T> toList(ListEnum listEnum);

    @Note("将自定义的集合容器，转换为 Set 集合")
    Set<T> toSet(SetEnum setEnum);

    @Note("将容器内的所有数据都拷贝到 target 集合里")
    void copyToCollection(Collection<T> target);

    @Note("将容器内所有数据打包成 Object 数组返回")
    Object[] toArray();

    @Note("将容器内所有数据打包成与容器同类型的数组返回")
    T[] toArray(Class<T> valueType);

    @Note("转为只读的 ArrayList 集合")
    OnlyReadArrayList<T> toOnlyReadArrayList();

    @Note("转为只读的 HashSet 集合")
    OnlyReadHashSet<T> toOnlyReadHashSet();

    @Note("转为只读的 LinkedHashSet 集合")
    OnlyReadLinkedSet<T> toOnlyReadLinkedSet();

    @Note("转为只读的 TreeSet 集合")
    OnlyReadTreeSet<T> toOnlyReadTreeSet();

    @Note("转为只读的 TreeSet 集合，并指定排序规则")
    OnlyReadTreeSet<T> toOnlyReadTreeSet(Comparator<? super T> comparator);

    @Note("对集合的数据，按指定的排序规则进行排序")
    void sort(Comparator<? super T> c);

}
